windowhandle: Don't drag on capture phase
authorAlexander Mikhaylenko <alexm@gnome.org>
Fri, 25 Dec 2020 07:35:57 +0000 (12:35 +0500)
committerAlexander Mikhaylenko <alexm@gnome.org>
Fri, 29 Jan 2021 07:00:10 +0000 (12:00 +0500)
This was needed to work around widgets claiming event sequences on press,
by ignoring them and starting the drag anyway unless they have certain
event controllers on them.

The most visible offender was GtkButton, but since the last commit it
doesn't claim the sequence anymore and we can remove the hack.

gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/gtkwindowhandle.c

index cddb261e477e4539e6ab5df4fb23f11e24630485..b00b031c94c028a5d4c068a25e3c786406f6b0ab 100644 (file)
@@ -11301,39 +11301,6 @@ gtk_widget_remove_controller (GtkWidget          *widget,
     gtk_list_list_model_item_removed (priv->controller_observer, before);
 }
 
-gboolean
-gtk_widget_consumes_motion (GtkWidget        *widget,
-                            GtkWidget        *parent,
-                            GdkEventSequence *sequence)
-{
-  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-
-  while (widget != NULL && widget != parent)
-    {
-      GList *l;
-
-      for (l = priv->event_controllers; l; l = l->next)
-        {
-          GtkEventController *controller = l->data;
-
-          if (controller == NULL ||
-              !GTK_IS_GESTURE (controller))
-            continue;
-
-          if ((!GTK_IS_GESTURE_SINGLE (controller) ||
-               GTK_IS_GESTURE_DRAG (controller) ||
-               GTK_IS_GESTURE_SWIPE (controller)) &&
-              gtk_gesture_handles_sequence (GTK_GESTURE (controller), sequence))
-            return TRUE;
-        }
-
-      widget = priv->parent;
-      priv = gtk_widget_get_instance_private (widget);
-    }
-
-  return FALSE;
-}
-
 void
 gtk_widget_reset_controllers (GtkWidget *widget)
 {
index 9848d4038f3823dbf023956e130dc7dc8fa43254..4aee55cb6b26fb0f1a8fdc70bd579f2eeeb781c5 100644 (file)
@@ -278,10 +278,6 @@ void              _gtk_widget_update_parent_muxer          (GtkWidget    *widget
 GtkActionMuxer *  _gtk_widget_get_action_muxer             (GtkWidget    *widget,
                                                             gboolean      create);
 
-gboolean          gtk_widget_consumes_motion               (GtkWidget        *widget,
-                                                            GtkWidget        *parent,
-                                                            GdkEventSequence *sequence);
-
 gboolean          gtk_widget_has_tick_callback             (GtkWidget *widget);
 
 gboolean          gtk_widget_has_size_request              (GtkWidget *widget);
index 5a6beeb273e57c60b88fc42178f029945675e4a1..f4f2fa6e4981036e2f007f19deac9eb8b8b90068 100644 (file)
@@ -60,7 +60,6 @@ struct _GtkWindowHandle {
 
   GtkGesture *click_gesture;
   GtkGesture *drag_gesture;
-  GtkGesture *bubble_drag_gesture;
 
   GtkWidget *child;
   GtkWidget *fallback_menu;
@@ -400,36 +399,12 @@ drag_gesture_update_cb (GtkGestureDrag  *gesture,
   if (ABS (offset_x) > double_click_distance ||
       ABS (offset_y) > double_click_distance)
     {
-      GdkEventSequence *sequence;
       double start_x, start_y;
       double native_x, native_y;
       double window_x, window_y;
       GtkNative *native;
       GdkSurface *surface;
 
-      sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
-
-      if (gtk_event_controller_get_propagation_phase (GTK_EVENT_CONTROLLER (gesture)) == GTK_PHASE_CAPTURE)
-        {
-          GtkWidget *event_widget = gtk_gesture_get_last_target (GTK_GESTURE (gesture), sequence);
-
-          /* Check whether the target widget should be left alone at handling
-           * the sequence, this is better done late to give room for gestures
-           * there to go denied.
-           *
-           * Besides claiming gestures, we must bail out too if there's gestures
-           * in the "none" state at this point, as those are still handling events
-           * and can potentially go claimed, and we don't want to stop the target
-           * widget from doing anything.
-           */
-          if (event_widget != GTK_WIDGET (self) &&
-              gtk_widget_consumes_motion (event_widget, GTK_WIDGET (self), sequence))
-            {
-              gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED);
-              return;
-            }
-        }
-
       gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
 
       gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
@@ -458,19 +433,6 @@ drag_gesture_update_cb (GtkGestureDrag  *gesture,
     }
 }
 
-static GtkGesture *
-create_drag_gesture (GtkWindowHandle *self)
-{
-  GtkGesture *gesture;
-
-  gesture = gtk_gesture_drag_new ();
-  g_signal_connect (gesture, "drag-update",
-                    G_CALLBACK (drag_gesture_update_cb), self);
-  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
-
-  return gesture;
-}
-
 static void
 gtk_window_handle_unrealize (GtkWidget *widget)
 {
@@ -562,19 +524,14 @@ gtk_window_handle_init (GtkWindowHandle *self)
 {
   self->click_gesture = gtk_gesture_click_new ();
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (self->click_gesture), 0);
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->click_gesture),
-                                              GTK_PHASE_BUBBLE);
   g_signal_connect (self->click_gesture, "pressed",
                     G_CALLBACK (click_gesture_pressed_cb), self);
   gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (self->click_gesture));
 
-  self->drag_gesture = create_drag_gesture (self);
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->drag_gesture),
-                                              GTK_PHASE_CAPTURE);
-
-  self->bubble_drag_gesture = create_drag_gesture (self);
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->bubble_drag_gesture),
-                                              GTK_PHASE_BUBBLE);
+  self->drag_gesture = gtk_gesture_drag_new ();
+  g_signal_connect (self->drag_gesture, "drag-update",
+                    G_CALLBACK (drag_gesture_update_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (self->drag_gesture));
 }
 
 static GtkBuildableIface *parent_buildable_iface;